<?php

/**
 * Description of Machine
 *
 * @author markos
 */
class VirtualLabs_Academico_Machine {

    const TABLE_NAME = "maquina_virtual";

    private $debugLog;

    public function __construct() {
        $this->debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
    }

    /**
     * Retorna los datos de cloudstack de una maquina virtual.
     * 
     * @param string $vmId identificador uuid de la maquina virtual
     * @return mixed $vm array con la informacion de la maquina virtual
     * @throws Exception $e en caso de ocurrir una excepcion la misma se hace flotar
     */
    public function getVmData($vmId) {
        $vmCloud = new VirtualLabs_Rest_VirtualLabs_VirtualMachine();
        try {
            $vm = $vmCloud->listVM($vmId);
            $this->debugLog->debug(print_r(Zend_Json_Decoder::decode($vm), true));
            return Zend_Json_Decoder::decode($vm);
        } catch (Exception $e) {
            $this->debugLog->err($e->getMessage());
            $this->debugLog->err($e->getTraceAsString());
        }
    }

    public function getVirtualMachine($fields = array(), $where = array()) {
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select()->from("maquina_virtual", $fields);
        foreach ($where as $key => $value) {
            $select->where("$key {$value['criteria']} ?", $value['value']);
        }

        try {
            return $db->fetchRow($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Retorna todos los laboratorios para un $username.
     * 
     * @param type $username
     * @return type
     * @throws Exception
     */
    public function getVmsByUsername($username) {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $select = $db->select()->from(array('m' => 'maquina_virtual'))
                    ->join(array('mu' => 'maquina_virtual_usuario'), 'm.codigo_maquina_virtual = mu.codigo_maquina_virtual')
//                    ->join(array('pe' => 'perfil_encendido'), 'pe.codigo_perfil_encendido = m.codigo_perfil_encendido', array('dias_encendido', 'hora_inicio_dia', 'hora_fin_dia', 'horas_utilizacion_diario', 'permite_fuera_horario'))
                    ->where('mu.username = ?', $username);

            return $db->fetchAll($select);
        } catch (Exception $e) {
            throw $e;
        }
    }

    /**
     * Retorna todos las maquinas virtuales asociadas al alumno $username 
     * que pertenezcan al laboratorio $codigoLaboratorio
     * 
     * @param string $username
     * @param int $codigoLaboratorio
     * @return mixed
     * @throws Exception
     */
    public function getVmsInLab($codigoLaboratorio, $username) {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $select = $db->select()->from(array('m' => 'maquina_virtual'), array('estado', 'codigo_vm', 'codigo_maquina_virtual'))
                    ->join(array('mu' => 'maquina_virtual_usuario'), 'm.codigo_maquina_virtual = mu.codigo_maquina_virtual', array())
                    ->join(array('ml' => 'miembro_laboratorio'), 'ml.username = mu.username', array())
                    ->join(array('l' => 'laboratorio'), 'ml.codigo_laboratorio = l.codigo_laboratorio', array())
                    ->join(array('u' => 'usuario', 'ml.username = u.username'), array())
                    ->join(array('pe' => 'perfil_encendido'), 'pe.codigo_perfil_encendido = l.codigo_perfil_encendido', array('dias_encendido', 'inicio_diario' => 'hora_inicio_dia', 'fin_diario' => 'hora_fin_dia', 'permite_fuera_horario'))
                    ->where('u.username = ?', $username)
                    ->where('l.codigo_laboratorio = ?', $codigoLaboratorio);
            $this->debugLog->debug($select);
            return $db->fetchAll($select);
        } catch (Exception $e) {
            throw $e;
        }
    }

    /**
     * 
     * @param type $codigoLaboratorio
     * @param type $username
     * @return type
     * @throws Exception
     */
    public function getAsociacionVMUser($codigoVM) {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $select = $db->select()->from(array('m' => 'maquina_virtual'), array('estado', 'codigo_vm', 'codigo_maquina_virtual'))
                    ->join(array('mu' => 'maquina_virtual_usuario'), 'm.codigo_maquina_virtual = mu.codigo_maquina_virtual', array())
                    ->where('m.codigo_maquina_virtual = ?', $codigoVM);

            return $db->fetchAll($select);
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function isUserVm($username, $codigo_maquina_virtual) {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $select = $db->select()->from(array('m' => 'maquina_virtual'))
                    ->join(array('mu' => 'maquina_virtual_usuario'), 'm.codigo_maquina_virtual = mu.codigo_maquina_virtual')
                    ->where('mu.username = ?', $username)
                    ->where('m.codigo_maquina_virtual = ?', $codigo_maquina_virtual);
            $this->debugLog->debug($select);

            $result = $db->fetchAll($select);

            return (count($result) > 0);
        } catch (Exception $e) {
            throw $e;
        }
    }

    /**
     * 
     * @param type $codigoVM
     * @return type
     * @throws Exception
     */
    public function getVMWithAjobId() {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $select = $db->select()->from(self::TABLE_NAME)
                    ->where("async_job_id != ''");
            return $db->fetchAll($select);
        } catch (Exception $e) {
            throw $e;
        }
    }

}

?>
